<?php
// $Id$

/**
 * Orders 封装来自 order 数据表的记录及领域逻辑
 */
class Orders extends QDB_ActiveRecord_Abstract
{

	/**
	 * 返回对象的定义
	 *
	 * @static
	 *
	 * @return array
	 */
	static function __define()
	{
		return array
		(
		// 指定该 ActiveRecord 要使用的行为插件
            'behaviors' => '',

		// 指定行为插件的配置
            'behaviors_settings' => array
		(
		# '插件名' => array('选项' => 设置),

		),

		// 用什么数据表保存对象
            'table_name' => 'order',

		// 指定数据表记录字段与对象属性之间的映射关系
		// 没有在此处指定的属性，QeePHP 会自动设置将属性映射为对象的可读写属性
            'props' => array
		(
		// 主键应该是只读，确保领域对象的“不变量”
                'id' => array('readonly' => true),
				'statusstr'=>array('getter' => 'format_orderstatus'),
				'card'=>array(
							QDB::HAS_ONE => 'Productcard',
							'source_key'=>'orderid',
							'target_key'=>'orderid'
						),
		/**
		 *  可以在此添加其他属性的设置
		 */
		# 'other_prop' => array('readonly' => true),

		/**
		 * 添加对象间的关联
		 */
		# 'other' => array('has_one' => 'Class'),
			
		),

		/**
		 * 允许使用 mass-assignment 方式赋值的属性
		 *
		 * 如果指定了 attr_accessible，则忽略 attr_protected 的设置。
		 */
            'attr_accessible' => '',

		/**
		 * 拒绝使用 mass-assignment 方式赋值的属性
		 */
            'attr_protected' => 'id',

		/**
		 * 指定在数据库中创建对象时，哪些属性的值不允许由外部提供
		 *
		 * 这里指定的属性会在创建记录时被过滤掉，从而让数据库自行填充值。
		 */
            'create_reject' => '',

		/**
		 * 指定更新数据库中的对象时，哪些属性的值不允许由外部提供
		 */
            'update_reject' => '',

		/**
		 * 指定在数据库中创建对象时，哪些属性的值由下面指定的内容进行覆盖
		 *
		 * 如果填充值为 self::AUTOFILL_TIMESTAMP 或 self::AUTOFILL_DATETIME，
		 * 则会根据属性的类型来自动填充当前时间（整数或字符串）。
		 *
		 * 如果填充值为一个数组，则假定为 callback 方法。
		 */
            'create_autofill' => array
		(
		# 属性名 => 填充值
		# 'is_locked' => 0,
		),

		/**
		 * 指定更新数据库中的对象时，哪些属性的值由下面指定的内容进行覆盖
		 *
		 * 填充值的指定规则同 create_autofill
		 */
            'update_autofill' => array
		(
		),

		/**
		 * 在保存对象时，会按照下面指定的验证规则进行验证。验证失败会抛出异常。
		 *
		 * 除了在保存时自动验证，还可以通过对象的 ::meta()->validate() 方法对数组数据进行验证。
		 *
		 * 如果需要添加一个自定义验证，应该写成
		 *
		 * 'title' => array(
		 *        array(array(__CLASS__, 'checkTitle'), '标题不能为空'),
		 * )
		 *
		 * 然后在该类中添加 checkTitle() 方法。函数原型如下：
		 *
		 * static function checkTitle($title)
		 *
		 * 该方法返回 true 表示通过验证。
		 */
            'validations' => array
		(
                'orderid' => array
		(
		array('max_length', 32, '唯一 订单编码不能超过 32 个字符'),

		),

                'type' => array
		(
		array('is_int', '0 充值卡 1 积分 2 直冲必须是一个整数'),

		),

                'orderpointer' => array
		(
		array('is_int', '积分点必须是一个整数'),

		),

                'ordertatolmoney' => array
		(
		array('is_int', '订单金额	单位分必须是一个整数'),

		),

                'userid' => array
		(
		array('max_length', 32, '订单用户不能超过 32 个字符'),

		),

                'target_userid' => array
		(
		array('max_length', 32, '目标账号不能超过 32 个字符'),

		),

                'orderaddress' => array
		(
		array('max_length', 255, '订单地址不能超过 255 个字符'),

		),

                'orderstatus' => array
		(
		array('is_int', '订单状态	0成功 1 等待支付 2 已经支付 3已经发货 3交易取消必须是一个整数'),

		),

                'createtime' => array
		(
		array('is_int', '订单生成时间必须是一个整数'),

		),

                'p_code' => array
		(
		array('max_length', 32, '产品编号不能超过 32 个字符'),

		),

                'des' => array
		(
		array('max_length', 255, '备注不能超过 255 个字符'),

		),


		),
		);
	}


	/* ------------------ 以下是自动生成的代码，不能修改 ------------------ */

	/**
	 * 开启一个查询，查找符合条件的对象或对象集合
	 *
	 * @static
	 *
	 * @return QDB_Select
	 */
	static function find()
	{
		$args = func_get_args();
		return QDB_ActiveRecord_Meta::instance(__CLASS__)->findByArgs($args);
	}

	/**
	 * 返回当前 ActiveRecord 类的元数据对象
	 *
	 * @static
	 *
	 * @return QDB_ActiveRecord_Meta
	 */
	static function meta()
	{
		return QDB_ActiveRecord_Meta::instance(__CLASS__);
	}


	/* ------------------ 以上是自动生成的代码，不能修改 ------------------ */
	function format_orderstatus()
	{
		switch ($this->orderstatus)
		{
			case 0:
				return '交易完成';
			case 1:
				return '等待支付';
			case 2:
				return '已经支付,等待发货';
			case 3:
				return '已经发货';
			case 999:
				return '交易取消';
			default:
				return '未知错误';
		}
	}
	static function sendorders($orderid)
	{
		$order = self::find('orderid = ?',$orderid)->getOne();
		if (!$order->id())
		{
			return '不存在的订单';
		}else {
			if ($order->orderstatus == 2)
			{
				QDB::getConn()->startTrans();
				try {
					$order->orderstatus = 3;
					$order->save();
					QDB::getConn()->completeTrans(TRUE);
					return true;
				} catch (Exception $e) {
					QDB::getConn()->completeTrans(false);
					QLog::log('订单状态更改失败,文件：'.__FILE__.',行:'.__LINE__);
					return '订单状态更改失败';
				}
			}
		}
	}
	static function get_orderid()
	{
		$tmp = array('0','1','3','4','5','6','7','8','9','2','a','b','c','d','e','f','g','h','i',
						'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
		$tmp_c = count($tmp) - 1;
		$orderid = 	$tmp[rand(1, $tmp_c)].$tmp[rand(1, $tmp_c)]
					.$tmp[rand(1, $tmp_c)].$tmp[rand(1, $tmp_c)]
					.$tmp[rand(1, $tmp_c)].$tmp[rand(1, $tmp_c)]
					.$tmp[rand(1, $tmp_c)].$tmp[rand(1, $tmp_c)]
					.$tmp[rand(1, $tmp_c)].$tmp[rand(1, $tmp_c)]
					.$tmp[rand(1, $tmp_c)].$tmp[rand(1, $tmp_c)]
					.$tmp[rand(1, $tmp_c)].$tmp[rand(1, $tmp_c)].'B'.Helper_Common::microtime_float();
		$ishave = self::find('orderid = ?',$orderid)->getOne();
		if ($ishave->id()) {
			$orderid .= rand(1, 99);
		}
		return strtoupper($orderid);
	}
}

